package com.example.hbase;

import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * ClassName: HBaseDDL
 * Package: com.example.hbase
 * Description:
 * User: fzykd
 *
 * @Author: LQH
 * Date: 2023-08-03
 * Time: 21:40
 */

public class HBaseDDL {

    //声明一个静态属性 创建连接
    public static Connection connection = HBaseThread.connection;

    //创建命名空间
    public static void createNamespace(String namespace) throws IOException {
        //1.获取admin
        //admin的连接是轻量级的 不是线程安全的 不推荐池化或者缓存这个连接
        Admin admin = connection.getAdmin();

        //2.调用方法 创建命名空间
        //代码相对shell更加底层 所以shell能够实现的功能 代码一定能实现
        //所以要填一个完整的命名空间描述

        //创建命令空间描述建造者
        NamespaceDescriptor.Builder builder = NamespaceDescriptor.create(namespace);

        //给命名空间添加需求
        builder.addConfiguration("user", "atguigu");

        //创建 命名空间会抛出异常 但是不应该抛出去 应该自己捕获处理
        try {
            admin.createNamespace(builder.build());
        } catch (IOException e) {
            System.out.println("命名空间已经存在");
            e.printStackTrace();
        }

        //3关闭admin
        admin.close();
    }


    //判断表格是否存在 要确定命名空间 要有两个参数
    //一个是命名空间 一个是表的名字
    public static boolean isTable(String namespace, String table) throws IOException {
        //1.获取admin
        Admin admin = connection.getAdmin();

        //使用方法判断表格是否存在

        boolean b = false;
        try {
            b = admin.tableExists(TableName.valueOf(namespace, table));
        } catch (IOException e) {
            e.printStackTrace();
        }

        //关闭连接
        admin.close();
        //
        return b;
    }

    /**
     * 创建表格
     * @param namespace 空间名称
     * @param table 表格名称
     * @param columnFamily 列族
     */
    public static void createTable(String namespace,String table,String... columnFamily) throws IOException {
        //列族是可变参数 可以不传参数来
        //但是创建表的时候 必须要有列族
        //所以一开始就要判断列族是否存在
        if(columnFamily.length == 0){
            //可以给一个默认值 或者直接返回
            System.out.println("创建表至少要一个列族");
            return;
        }
        //获取admin
        Admin admin = connection.getAdmin();
        //调用创建表格的方法
        //2.1创建表格描述
        TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, table));
        for (String column : columnFamily) {

            //创建列族描述
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder =
                    ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(column));

            //对应当前列族 添加参数
            columnFamilyDescriptorBuilder.setMaxVersions(5);
            //创建完添加参数的列族描述
            builder.setColumnFamily(columnFamilyDescriptorBuilder.build());
        }
        //创建对应的表格描述
        try {
            admin.createTable(builder.build());
        } catch (IOException e) {
            System.out.println("表格已经存在");
            e.printStackTrace();
        }
        //3.关闭admin
        admin.close();


    }


    public static void main(String[] args) throws IOException {
        //测试创建命名空间
        //createNamespace("atguigu");

        //测试表格是否存在
        //boolean table1 = isTable("bigdata", "student");
        //System.out.println(table1);
        //boolean table = isTable("atguigu", "abc");
        //System.out.println(table);

        createTable("atguigu","student","info","msg");

        //
        System.out.println("其他代码");

        //关闭连接
        connection.close();
    }
}
